package com.miracle.shiro.md5;

import org.apache.shiro.crypto.hash.SimpleHash;

/**
 * @Author: rupert-tears
 * @Date: Created in 16:35 2021/7/16
 * @Description: 优秀的人都在孤独的翻山越岭！
 */
public class Md5 {
    public static void main(String[] args) {
        String password = "990728";
        // 使用MD5对数据进行加密
        // 参数1：加密算法的名称 参数2：为需要被加密的数据
        // 返回值：加密后的数据内容
        Object obj = new SimpleHash("MD5", password);
        // \t:是补全当前字符串长度到8的整数倍，最少1个最多8个空格
        System.out.println("对" + password + "使用MD5加密的数据：\t" + obj);

        /*
         盐加密:
            使用盐加密可以改变MD5的加密数据结果
            参数3：salt为加密时所需要使用到的盐值
            注意：
                1.为了保障密码的更加安全，盐通常是一个唯一的值；例如用户的账号，或者随机生成一个盐值
                2.如果使用随机盐加密数据，会导致每次加密盐的结果都不同，这就要求盐在短时间内需要被共享，
                否则我们将无法验证用户的密码是否正确
                3.所谓的盐加密：本质就是将盐与被加密的数据拼接在一起后在使用MD5进行加密
         */
        String salt = "rupert-tears";
        Object obj2 = new SimpleHash("MD5", password, salt);
        System.out.println("对" + password + "使用MD5配合盐" + salt + "加密的数据：\t" + obj2);

        // 注意是盐在前，密码在后
        Object obj3 = new SimpleHash("MD5", salt + password);
        System.out.println("对" + password + "模拟盐" + salt + "加密的数据：\t" + obj3);

          /*
          参数4：指定加密次数
          注意：1.不同的加密次数加密后的数据结果是不同的
               2.对一个数据加密2次的结果不等于对这个数据加密一次后在加密一次的结果
          */
        Object obj4 = new SimpleHash("MD5",password,salt,1);
        System.out.println("使用MD5盐加密2次：\t" + obj4);
        Object obj5 = new SimpleHash("MD5","dd220a2e4cb00041cf4f78a9544fdbf2",salt,1);
        System.out.println("使用MD5盐加密一次后在加密：\t" + obj5);
    }
}
